package plp.imperative2.expression;

import org.joda.time.*;

public class Data {

	private DateTime data;

	int dia = 0;
	int mes = 0;
	int ano = 0;
	int hora = 0;
	int minuto = 0, segundo = 0, milisegundo = 0;

	private boolean mesEhNumerico;
	private boolean anoTemDoisDigitos;
	private boolean temHora;
	private boolean temSegundos;
	private boolean temMilissegundos;

	public Data(String dataValor) {

		try {

			String[] values = dataValor.split("/");

			dia = Integer.parseInt(values[0]);

			if (values[1].length() == 2) {
				mes = Integer.parseInt(values[1]);
				mesEhNumerico = true;
			} else {
				verificaMes(values[1]);
				mesEhNumerico = false;
			}

			if (values[2].length() <= 4) {
				ano = extrairAno(values[2]);
				anoTemDoisDigitos = true;

			} else {
				String[] termos = values[2].split(":");
				String anoHora = termos[0];
				hora = Integer
						.parseInt(anoHora.substring(anoHora.length() - 2));
				ano = extrairAno(anoHora.substring(0, anoHora.length() - 3)
						.trim());
				minuto = Integer.parseInt(termos[1]);
				temHora = true;

				if (termos.length > 2) {
					if (termos[2].length() == 2) {
						segundo = Integer.parseInt(termos[2]);
					} else {
						String[] temp = termos[2].split("\\.");
						segundo = Integer.parseInt(temp[0]);
						milisegundo = Integer.parseInt(temp[1]);

						temMilissegundos = true;
					}
					temSegundos = true;
				}
				anoTemDoisDigitos = false;

			}

			this.data = new DateTime(ano, mes, dia, hora, minuto, segundo,
					milisegundo);

		} catch (Exception ex) {
			throw new IllegalArgumentException("ERRO: " + ex.getMessage());
		}
	}

	private void verificaMes(String value) {
		if (value.equalsIgnoreCase("jan")) {
			mes = 1;
		} else if (value.equalsIgnoreCase("fev")) {
			mes = 2;
		} else if (value.equalsIgnoreCase("mar")) {
			mes = 3;
		} else if (value.equalsIgnoreCase("abr")) {
			mes = 4;
		} else if (value.equalsIgnoreCase("mai")) {
			mes = 5;
		} else if (value.equalsIgnoreCase("jun")) {
			mes = 6;
		} else if (value.equalsIgnoreCase("jul")) {
			mes = 7;
		} else if (value.equalsIgnoreCase("ago")) {
			mes = 8;
		} else if (value.equalsIgnoreCase("set")) {
			mes = 9;
		} else if (value.equalsIgnoreCase("out")) {
			mes = 10;
		} else if (value.equalsIgnoreCase("nov")) {
			mes = 11;
		} else if (value.equalsIgnoreCase("dez")) {
			mes = 12;
		}
	}
	

	public Data(DateTime datetime) {
		this.data = datetime;
	}

	public DateTime getValue() {
		return this.data;
	}

	private int extrairAno(String value) {
		int ano;
		ano = Integer.parseInt(value);
		if (value.length() == 2) {
			if (ano > 20) {
				ano = Integer.parseInt("19" + ano);
			} else {
				ano = Integer.parseInt("20" + ano);
			}
		}
		return ano;
	}

	@Override
	public String toString() {
		String format = String.format("%02d", this.data.getDayOfMonth());
		if (mesEhNumerico) {
			format = format + String.format("/%02d", this.data.getMonthOfYear());
		} else {
			format = format + String.format("/%s",  this.data.getMonthOfYear());
		}
		format = format + String.format("/%04d", this.data.getYear());
		if (temHora) {
			format = format
					+ String.format(" %02d:%02d", this.data.getHourOfDay(),
							this.data.getMinuteOfHour());
			if (temSegundos) {
				format = format
						+ String.format(":%02d", this.data.getSecondOfMinute());
				if (temMilissegundos) {
					format = format
							+ String.format(".%03d",
									this.data.getMillisOfSecond());
				}
			}

		}
		return format;

	}

	@Override
	public boolean equals(Object obj) {
		return this.getValue().equals(((Data) obj).getValue());
	}

	public static void main(String[] args) {
		Data data = new Data("28/fev/2010T15:10:09.679");
		System.out.println(data.toString());
	}
}
